/**
 * Copyright c FOUNDER CORPORATION 2006 All Rights Reserved.
 *
 * DateUtil.java
 */
package com.iori.common.util;

import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import com.iori.common.log.FounderLog;
import com.iori.common.log.LogFactory;

/**
 * [クラス名]<br>
 * 日付処理Utilityクラス<br>
 * [機能概要]<br>
 * 日付変換、チェック関数群<br>
 * [変更履歴]<br>
 * 2003/11/06 ver1.00 新規作成 zhanjc<br>
 * 2007/04/21 ver1.10 追加从配置文件读取当前时间的功能<br>
 *
 * @author zhanjc
 * @version 1.10
 */
public class DateUtil {

	/**
	 * ログ出力用。
	 */
	private static FounderLog debugLog = LogFactory
			.getFounderLog(DateUtil.class);

	/**
	 * 测试用配置文件的路径
	 */
	private static final String DATE_CONFIG_FILE_NAME = "LocalDate.xml";

	private static final SimpleDateFormat MESSAGE_TIMESTAMP_DATEFORMATE = new SimpleDateFormat(
			"yyyy-MM-dd'T'HH:mm:ss'Z'");

	private static final SimpleDateFormat MESSAGE_TIMESTAMP_SIMPLE_DATEFORMATE = new SimpleDateFormat(
			"yyyy-MM-dd");

	private static final SimpleDateFormat MESSAGE_TIMESTAMP_MSEC = new SimpleDateFormat(
			"SSS");

	private static final SimpleDateFormat MESSAGE_TIMESTAMP_DATEFORMATE_SEC = new SimpleDateFormat(
			"yyyy-MM-dd HH:mm:ss");

	/**
	 * XML文書のファクトリーを格納する
	 */
	private static DocumentBuilderFactory factory = null;

	// 変量の初期化
	static {
		TimeZone utc = TimeZone.getTimeZone("UTC");
		MESSAGE_TIMESTAMP_DATEFORMATE.setTimeZone(utc);
		MESSAGE_TIMESTAMP_MSEC.setTimeZone(utc);
		try {
			factory = DocumentBuilderFactory.newInstance();
		} catch (Exception pce) {
		}
	}

	/**
	 * 指定した西暦の時間を取得する。<br>
	 *
	 * @return Date
	 *
	 *
	 */
	public static Date getCurrentTime() {
		// 查找在指定的位置是否存在配置文件，如果存在返回配置的时间，如果不存在，返回系统时间
		String filePath = XmlConfigPath.getXmlConfigPath()
				+ DATE_CONFIG_FILE_NAME;
		File dateFile = new File(filePath);
		if (!dateFile.exists()) {
			return new Date();
		}

		Document dom = null;
		Date fileDate = null;
		// 解析xml文件
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			dom = builder.parse(dateFile);
		} catch (SAXException se) {
			throw new IllegalStateException(se);
		} catch (IOException ie) {
			throw new IllegalStateException(ie);
		} catch (ParserConfigurationException e) {
			throw new IllegalStateException(e);
		}
		dom.normalize();

		NodeList dateConfigList = dom.getDocumentElement().getChildNodes();
		String date = "";
		String time = "";
		for (int i = 0; i < dateConfigList.getLength(); i++) {
			Node dateConfig = dateConfigList.item(i);
			if ("date".equals(dateConfig.getNodeName())) {
				date = dateConfig.getLastChild() == null ? "" : dateConfig
						.getLastChild().getNodeValue().trim();
			} else if ("time".equals(dateConfig.getNodeName())) {
				time = dateConfig.getLastChild() == null ? "" : dateConfig
						.getLastChild().getNodeValue().trim();
				;
			}
		}

		// 如果没有配置date,则返回当前的年月日
		if ("".equals(date)) {
			SimpleDateFormat dFmt = new SimpleDateFormat("yyyy/MM/dd");
			date = dFmt.format(new Date());
		}

		// 如果没有配置time,则返回当前的时分秒
		if ("".equals(time)) {
			SimpleDateFormat tFmt = new SimpleDateFormat("HH:mm:ss");
			time = tFmt.format(new Date());
		}
		// 拼出配置时间
		String dateTime = (date.trim() + " " + time.trim()).trim();
		try {
			fileDate = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
					.parse(dateTime);
		} catch (ParseException pe) {
			throw new IllegalStateException(pe);
		}
		return fileDate;

	}

	/**
	 * 指定した西暦の時間を取得する。<br>
	 *
	 * @return String 年月(yyyyMMddHHmmss)
	 *
	 *
	 */
	public static String getCurrentTimeString() {
		SimpleDateFormat dFmt = new SimpleDateFormat("yyyyMMddHHmmss");
		return dFmt.format(getCurrentTime());
	}

	/**
	 * 指定した西暦の当日を取得する。<br>
	 *
	 * @return Date
	 *
	 *
	 */
	public static Date getCurrentDate() {
		// 查找在指定的位置是否存在配置文件，如果存在返回配置的时间，如果不存在，返回系统时间
		String filePath = XmlConfigPath.getXmlConfigPath()
				+ DATE_CONFIG_FILE_NAME;
		File dateFile = new File(filePath);
		if (!dateFile.exists()) {
			return new Date();
		}

		// 解析xml文件
		Document dom = null;
		Date fileDate = null;
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			dom = builder.parse(dateFile);
		} catch (SAXException se) {
			throw new IllegalStateException(se);
		} catch (IOException ie) {
			throw new IllegalStateException(ie);
		} catch (ParserConfigurationException e) {
			throw new IllegalStateException(e);
		}
		dom.normalize();
		NodeList dateConfigList = dom.getDocumentElement().getChildNodes();
		String date = "";
		for (int i = 0; i < dateConfigList.getLength(); i++) {
			Node dateConfig = dateConfigList.item(i);
			if ("date".equals(dateConfig.getNodeName())) {
				date = dateConfig.getLastChild() == null ? "" : dateConfig
						.getLastChild().getNodeValue().trim();
				break;
			}
		}

		// 如果没有配置date,则返回当前的年月日
		if ("".equals(date)) {
			SimpleDateFormat dFmt = new SimpleDateFormat("yyyy/MM/dd");
			date = dFmt.format(new Date());
		}

		try {
			fileDate = new SimpleDateFormat("yyyy/MM/dd").parse(date);
		} catch (ParseException pe) {
			throw new IllegalStateException(pe);
		}
		return fileDate;
	}

	/**
	 * 指定した西暦の当日を取得する。<br>
	 *
	 * @return String 年月(yyyymmdd)
	 *
	 *
	 */
	public static String getCurrentDateString() {
		SimpleDateFormat dFmt = new SimpleDateFormat("yyyyMMdd");
		return dFmt.format(getCurrentDate());
	}

	/**
	 * 指定される形式について、時間から日期を生成する
	 *
	 * @param time
	 * @param formatString
	 * @return
	 */
	public static String getDate(long time) {
		Date date = new Date(time);
		return MESSAGE_TIMESTAMP_DATEFORMATE.format(date);
	}

	/**
	 * 時間のミリセカンドを生成する
	 *
	 * @param time
	 * @return
	 */
	public static String getMsec(long time) {
		Date date = new Date(time);
		return MESSAGE_TIMESTAMP_MSEC.format(date);
	}

	/**
	 * 指定される形式について、日期を表示する文字列から時間を取得する
	 *
	 * @param sDate
	 * @param sMsec
	 * @param formatString
	 * @return
	 */
	public static long getTime(String sDate, String sMsec) {
		long time = 0;

		try {
			Date date = MESSAGE_TIMESTAMP_DATEFORMATE.parse(sDate);
			time = date.getTime() + Long.parseLong(sMsec);

		} catch (ParseException e) {
			debugLog.error(e, e.getMessage());

		}

		return time;
	}
	
	/**
	 * 指定した西暦のフォーマットの当日を取得する。<br>
	 *
	 * @param datePattern フォーマット
	 * @return String 年月
	 *
	 */
	public static String getCurrentTime(String datePattern){
		
		  Date date = new Date();   
		  SimpleDateFormat sdf = new SimpleDateFormat(datePattern);   
		  return sdf.format(date);
		  
	}

	public static String getTime(Timestamp timestamp) {
		return MESSAGE_TIMESTAMP_SIMPLE_DATEFORMATE.format(timestamp)
				.toString();
	}

	public static String getTimeSec(Timestamp timestamp) {
		return MESSAGE_TIMESTAMP_DATEFORMATE_SEC.format(timestamp).toString();
	}
}